using System;
using System.Collections.Generic;
using System.Text;

using System.Data.Common;

using MakeIT.Framework.Data;
using MakeIT.MakeIT.Laundy.Agromotor.Site.Entidades;

namespace MakeIT.MakeIT.Laundy.Agromotor.Site.Negocios
{
	public partial class AgromotorsiteDAO : DAO
	{

		public static PecaVO getPeca(int? idPeca, string peca)
		{
			PecaVO pecaVO = null;
            List<PecaVO> listPecaVOs = getPecas(idPeca, peca, null, null, null, null, null);
			if (listPecaVOs != null && listPecaVOs.Count > 0)
			{
				pecaVO = listPecaVOs[0];
			}
			return pecaVO;
		}

		public static PecaVO getPeca(int? idPeca)
		{
			return getPeca(idPeca, null);
		}

		public static List<PecaVO> getPecas()
		{
            return getPecas(null, null, null, null, null, null, null);
		}

		public static List<PecaVO> getPecas(int? idPeca)
		{
            return getPecas(idPeca, null, null, null, null, null, null);
		}
        public static List<PecaVO> getPecas(int? idPeca, string peca, int? idCategoria, string codigo, bool? loja, bool? orcamento, bool? banner)
        {
            return getPecas(idPeca, peca, idCategoria, codigo, loja, orcamento, banner, null);
        }

        public static List<PecaVO> getPecas(int? idPeca, string peca, int? idCategoria, string codigo, bool? loja, bool? orcamento, bool? banner, bool? orderByNome)
		{
			string where = "WHERE ";
			StringBuilder query = new StringBuilder();

            query.AppendLine("SELECT pec.idPeca as pec_idPeca, pec.peca as pec_peca, pec.codigo as pec_codigo, pec.imagemMime as pec_imagemMime, pec.imagemNome as pec_imagemNome , pec.imagemTamanho as pec_imagemTamanho , pec.loja as pec_loja, pec.orcamento as pec_orcamento, pec.banner as pec_banner, pec.idCategoria as pec_idCategoria, cat.categoria as cat_categoria, pec.Cadastro as pec_Cadastro, pec.CadastradoPor as pec_CadastradoPor, pec.Edicao as pec_Edicao, pec.EditadoPor as pec_EditadoPor  ");
            query.AppendLine("FROM peca as pec  LEFT OUTER JOIN categoria as cat on pec.idCategoria=cat.idCategoria ");
			if (idPeca != null)
			{
				query.AppendLine(where + "pec.idPeca=@idPeca ");
				where = "AND ";
			}
			if (!string.IsNullOrEmpty(peca) || !string.IsNullOrEmpty(codigo))
			{
                query.Append(where + "(");
                where = "";

                if (!string.IsNullOrEmpty(peca))
                {
                    string[] palavras = peca.Replace("\"", "").Split(' ');
                    foreach (string palavra in palavras)
                    {
                        if (palavra.Length > 0)
                        {
                            query.Append(where + "pec.peca LIKE \"%" + palavra + "%\" ");
                            where = "OR ";
                        }
                    }
                }
                if (!string.IsNullOrEmpty(codigo))
                {
                    string[] codigos = codigo.Replace("\"","").Split(' ');
                    foreach (string codgo in codigos)
                    {
                        if (codgo.Length > 0)
                        {
                            query.Append(where + "pec.codigo LIKE \"%" + codgo + "%\" ");
                            where = "OR ";
                        }
                    }
                }

                query.AppendLine(") ");
                where = "AND ";
			}
			if (loja != null)
			{
				query.AppendLine(where + "pec.loja=@loja ");
				where = "AND ";
			}
			if (orcamento != null)
			{
				query.AppendLine(where + "pec.orcamento=@orcamento ");
				where = "AND ";
			}
			if (banner != null)
			{
				query.AppendLine(where + "pec.banner=@banner ");
				where = "AND ";
			}
            if (idCategoria != null)
            {
                query.AppendLine(where + "pec.idCategoria=@idCategoria ");
                where = "AND ";
            }


            query.AppendLine("ORDER BY pec." + (orderByNome != null && orderByNome.Value ? "peca" : "codigo") + " ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			if (idPeca!= null) cmd.Parameters.Add(getParameter(cmd, "@idPeca", idPeca));
            //if (peca!= null) cmd.Parameters.Add(getParameter(cmd, "@peca", "%"+peca+"%"));
            //if (codigo!= null) cmd.Parameters.Add(getParameter(cmd, "@codigo", codigo));
			if (loja!= null) cmd.Parameters.Add(getParameter(cmd, "@loja", loja.Value?"S":"N"));
			if (orcamento!= null) cmd.Parameters.Add(getParameter(cmd, "@orcamento", orcamento.Value?"S":"N"));
			if (banner!= null) cmd.Parameters.Add(getParameter(cmd, "@banner", banner.Value?"S":"N"));
            if (idCategoria != null) cmd.Parameters.Add(getParameter(cmd, "@idCategoria", idCategoria));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();

				List<PecaVO> listPeca = new List<PecaVO>();

				while (reader.Read())
				{
					PecaVO pecaVO = PecaVO.CreateVO();
					pecaVO.idPeca = reader.GetInt32(reader.GetOrdinal("pec_idPeca"));
					pecaVO.peca = reader.GetString(reader.GetOrdinal("pec_peca"));
					pecaVO.codigo = reader.GetString(reader.GetOrdinal("pec_codigo"));
					if (!reader.IsDBNull(reader.GetOrdinal("pec_imagemMime")))
						pecaVO.imagemMime = reader.GetString(reader.GetOrdinal("pec_imagemMime"));
					if (!reader.IsDBNull(reader.GetOrdinal("pec_imagemNome")))
						pecaVO.imagemNome = reader.GetString(reader.GetOrdinal("pec_imagemNome"));
					if (!reader.IsDBNull(reader.GetOrdinal("pec_imagemTamanho")))
						pecaVO.imagemTamanho = reader.GetInt32(reader.GetOrdinal("pec_imagemTamanho"));
					pecaVO.loja = reader.GetString(reader.GetOrdinal("pec_loja")).Equals("S");
					pecaVO.orcamento = reader.GetString(reader.GetOrdinal("pec_orcamento")).Equals("S");
					pecaVO.banner = reader.GetString(reader.GetOrdinal("pec_banner")).Equals("S");
                    if (!reader.IsDBNull(reader.GetOrdinal("pec_idCategoria")))
                        pecaVO.idCategoria = reader.GetInt32(reader.GetOrdinal("pec_idCategoria"));
                    if (!reader.IsDBNull(reader.GetOrdinal("cat_categoria")))
                        pecaVO.idCategoriaVO.categoria = reader.GetString(reader.GetOrdinal("cat_categoria"));
                    pecaVO.cadastro = reader.GetDateTime(reader.GetOrdinal("pec_Cadastro"));
					pecaVO.cadastradoPor = reader.GetString(reader.GetOrdinal("pec_CadastradoPor"));
					pecaVO.edicao = reader.GetDateTime(reader.GetOrdinal("pec_Edicao"));
					pecaVO.editadoPor = reader.GetString(reader.GetOrdinal("pec_EditadoPor"));


					listPeca.Add(pecaVO);
				}
				reader.Close();
				return listPeca;
			}
			catch (Exception ex) { throw ex; }
            finally
            {
                if (reader != null && !reader.IsClosed)
                    reader.Close();
                if (cmd != null && cmd.Connection != null)
                    cmd.Connection.Close();
            }
        }

		public static void setPeca(PecaVO pecaVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("UPDATE peca ");
            query.AppendLine("SET peca=@peca, codigo=@codigo, imagemMime=@imagemMime, imagemNome=@imagemNome, imagemTamanho=@imagemTamanho, loja=@loja, orcamento=@orcamento, banner=@banner, idCategoria=@idCategoria,  Cadastro=@Cadastro, CadastradoPor=@CadastradoPor, Edicao=@Edicao, EditadoPor=@EditadoPor ");
			query.AppendLine("WHERE idPeca=@idPeca ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idPeca", pecaVO.idPeca));
			cmd.Parameters.Add(getParameter(cmd, "@peca", pecaVO.peca));
			cmd.Parameters.Add(getParameter(cmd, "@codigo", pecaVO.codigo));
			cmd.Parameters.Add(getParameter(cmd, "@imagemMime", pecaVO.imagemMime));
			cmd.Parameters.Add(getParameter(cmd, "@imagemNome", pecaVO.imagemNome));
			cmd.Parameters.Add(getParameter(cmd, "@imagemTamanho", pecaVO.imagemTamanho));
			cmd.Parameters.Add(getParameter(cmd, "@loja", (pecaVO.loja==null?" ":(pecaVO.loja.Value?"S":"N"))));
			cmd.Parameters.Add(getParameter(cmd, "@orcamento", (pecaVO.orcamento==null?" ":(pecaVO.orcamento.Value?"S":"N"))));
			cmd.Parameters.Add(getParameter(cmd, "@banner", (pecaVO.banner==null?" ":(pecaVO.banner.Value?"S":"N"))));
            if (pecaVO.idCategoria == null)
                cmd.Parameters.Add(getParameter(cmd, "@idCategoria", System.DBNull.Value));
            else
                cmd.Parameters.Add(getParameter(cmd, "@idCategoria", pecaVO.idCategoria));
            cmd.Parameters.Add(getParameter(cmd, "@Cadastro", pecaVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@CadastradoPor", pecaVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@Edicao", pecaVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@EditadoPor", pecaVO.editadoPor));

			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }
            finally
            {
                if (cmd != null && cmd.Connection != null)
                    cmd.Connection.Close();
            }

		}

		public static long newPeca(PecaVO pecaVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("INSERT INTO peca ");
            query.AppendLine("  ( peca, codigo, imagemMime, imagemNome, imagemTamanho, loja, orcamento, banner, idCategoria, Cadastro, CadastradoPor, Edicao, EditadoPor ) ");
            query.AppendLine("VALUES ( @peca, @codigo, @imagemMime, @imagemNome, @imagemTamanho, @loja, @orcamento, @banner, @idCategoria, @Cadastro, @CadastradoPor, @Edicao, @EditadoPor ) ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@peca", pecaVO.peca));
			cmd.Parameters.Add(getParameter(cmd, "@codigo", pecaVO.codigo));
			cmd.Parameters.Add(getParameter(cmd, "@imagemMime", pecaVO.imagemMime));
			cmd.Parameters.Add(getParameter(cmd, "@imagemNome", pecaVO.imagemNome));
			cmd.Parameters.Add(getParameter(cmd, "@imagemTamanho", pecaVO.imagemTamanho));
			cmd.Parameters.Add(getParameter(cmd, "@loja", (pecaVO.loja==null?" ":(pecaVO.loja.Value?"S":"N"))));
			cmd.Parameters.Add(getParameter(cmd, "@orcamento", (pecaVO.orcamento==null?" ":(pecaVO.orcamento.Value?"S":"N"))));
			cmd.Parameters.Add(getParameter(cmd, "@banner", (pecaVO.banner==null?" ":(pecaVO.banner.Value?"S":"N"))));
            if (pecaVO.idCategoria == null)
                cmd.Parameters.Add(getParameter(cmd, "@idCategoria", System.DBNull.Value));
            else
                cmd.Parameters.Add(getParameter(cmd, "@idCategoria", pecaVO.idCategoria));
            cmd.Parameters.Add(getParameter(cmd, "@Cadastro", pecaVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@CadastradoPor", pecaVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@Edicao", pecaVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@EditadoPor", pecaVO.editadoPor));


			try
			{
				cmd.ExecuteNonQuery();

				long newID = 0;
				if (tipo.Equals(DBType.MSSql))
				{
					cmd.CommandText = "SELECT IDENT_CURRENT('peca') AS 'Identity' ";
					DbDataReader reader = cmd.ExecuteReader();
					reader.Read();
					newID = (long)reader.GetDecimal(reader.GetOrdinal("Identity"));
					reader.Close();
				}
				else if (tipo.Equals(DBType.MySql))
				{
					newID = ((MySql.Data.MySqlClient.MySqlCommand)cmd).LastInsertedId;
				}
				else if (tipo.Equals(DBType.ODBC))
				{
					//TODO implementar
				}
				else if (tipo.Equals(DBType.ORACLE))
				{
					//TODO implementar
				}
				return newID;
			}
			catch (Exception ex) { throw ex; }
            finally
            {
                if (cmd != null && cmd.Connection != null)
                    cmd.Connection.Close();
            }

		}

		public static void delPeca(PecaVO pecaVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("DELETE FROM peca ");
			query.AppendLine("WHERE idPeca=@idPeca ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idPeca", pecaVO.idPeca));


			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }
            finally
            {
                if (cmd != null && cmd.Connection != null)
                    cmd.Connection.Close();
            }

		}

        public static int getCountPecaxIdCategoria(int? idCategoria)
        {
            StringBuilder query = new StringBuilder();

            query.AppendLine("SELECT COUNT(idCategoria) as ocorrencias FROM peca WHERE IdCategoria=@IdCategoria ");

            DbCommand cmd = getCommand();
            cmd.CommandText = query.ToString();

            cmd.Parameters.Add(getParameter(cmd, "@IdCategoria", idCategoria));

            DbDataReader reader = null;
            try
            {
                reader = cmd.ExecuteReader();
                reader.Read();

                int ocorrencias = 0;
                ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
                reader.Close();
                return ocorrencias;
            }
            catch (Exception ex) { throw ex; }
            finally
            {
                if (reader != null && !reader.IsClosed)
                    reader.Close();
                if (cmd != null && cmd.Connection != null)
                    cmd.Connection.Close();
            }
        }
        
        public static void setPecaImagem(PecaVO pecaVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("UPDATE peca ");
			query.AppendLine("SET imagem=@imagem, imagemMime=@imagemMime, imagemNome=@imagemNome, imagemTamanho=@imagemTamanho ");
			query.AppendLine("WHERE idPeca=@idPeca ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idPeca", pecaVO.idPeca));

			cmd.Parameters.Add(getParameter(cmd, "@imagem", pecaVO.imagem));
			cmd.Parameters.Add(getParameter(cmd, "@imagemMime", pecaVO.imagemMime));
			cmd.Parameters.Add(getParameter(cmd, "@imagemNome", pecaVO.imagemNome));
			cmd.Parameters.Add(getParameter(cmd, "@imagemTamanho", pecaVO.imagemTamanho));

			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }
            finally
            {
                if (cmd != null && cmd.Connection != null)
                    cmd.Connection.Close();
            }

		}

		public static void getPecaImagem(PecaVO pecaVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT imagem as pec_imagem, imagemMime as pec_imagemMime, imagemNome as pec_imagemNome, imagemTamanho as pec_imagemTamanho ");
			query.AppendLine("FROM peca ");
			query.AppendLine("WHERE idPeca=@idPeca ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idPeca", pecaVO.idPeca));


			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();

				if (reader.Read())
				{
					pecaVO.imagem = getBytesFromBlob(reader, "pec_imagem");

					if (!reader.IsDBNull(reader.GetOrdinal("pec_imagemMime")))
						pecaVO.imagemMime = reader.GetString(reader.GetOrdinal("pec_imagemMime"));
					if (!reader.IsDBNull(reader.GetOrdinal("pec_imagemNome")))
						pecaVO.imagemNome = reader.GetString(reader.GetOrdinal("pec_imagemNome"));
					if (!reader.IsDBNull(reader.GetOrdinal("pec_imagemTamanho")))
						pecaVO.imagemTamanho = reader.GetInt32(reader.GetOrdinal("pec_imagemTamanho"));

				}
				reader.Close();
				return;
			}
			catch (Exception ex) { throw ex; }
            finally
            {
                if (reader != null && !reader.IsClosed)
                    reader.Close();
                if (cmd != null && cmd.Connection != null)
                    cmd.Connection.Close();
            }
        }

	}
}
